package java2020spring;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class Calculator extends JFrame{
	public Calculator (String s,int x,int y){
		setTitle(s);
		setSize(x,y);
		CalcultorPanel calcultorPanel=new CalcultorPanel();

		getContentPane().add(calcultorPanel);
		setVisible(true);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	}
	
}
//设计面板
class CalcultorPanel extends JPanel implements ActionListener{
	JTextField tf = new JTextField();
	String str1="0";
	String str2;          //记录文本框内字符
	String m="";		  //用于MS等内存功能
	JButton b[] = new JButton[28];
	public CalcultorPanel(){
		setSize(420,680);
		setLayout(new GridLayout(3,1));
//设置按钮
		String a[] = { "MC", "MR", "MS", "M+", "%", "CE", "C", "backspace","1/x", "x²", 
				"sqrt", "÷", "7", "8", "9", "×", "4", "5", "6", "-", "1", "2", "3", "+", "+/-", "0", ".", "="};
		JPanel jp1 = new JPanel();
		JPanel jp2 = new JPanel();
		JPanel jp3 = new JPanel();
		JPanel jpin = new JPanel();		
		tf.setEditable(false);		//文本框不可修改
		tf.setFont(new Font("标楷体", Font.BOLD, 48));//文本框字体格式大小
		tf.setHorizontalAlignment(SwingConstants.RIGHT);//文本框内文字向右对齐
		tf.setText(str1);
		JMenuBar menubar = new JMenuBar();
		JMenu menu = new JMenu("三");
		menu.setFont(new Font("黑体", Font.BOLD, 20));
		JLabel label = new JLabel("标准型");
		label.setFont(new Font("标楷体", Font.BOLD, 25));
		menubar.add(menu);
		menubar.add(label);
//面板布局
		jp1.setLayout(new GridLayout(3,1));
		jp1.add(menubar);
		jp1.add(tf);
		jp1.add(jpin);
		jpin.setLayout(new GridLayout(1,4));
		for(int i=0;i<4;i++){
			b[i]=new JButton(String.valueOf(a[i]));
			jpin.add(b[i]);
		}
		jp2.setLayout(new GridLayout(3,4));
		for(int i=4;i<16;i++){
			b[i]=new JButton(String.valueOf(a[i]));
			jp2.add(b[i]);
		}
		jp3.setLayout(new GridLayout(3,4));
		for(int i=16;i<28;i++){
			b[i]=new JButton(String.valueOf(a[i]));
			jp3.add(b[i]);
		}
//设置按钮大小颜色
		for(int i=0;i<11;i++){
			b[i].setFont(new Font("标楷体", Font.BOLD, 16));
			b[i].setForeground(Color.BLACK);
		}
		b[7].setFont(new Font("标楷体", Font.BOLD, 13));
		for(int i=11;i<28;i++){
			b[i].setFont(new Font("标楷体", Font.BOLD, 20));
			b[i].setForeground(Color.BLACK);
		}
		for(int i=0;i<4;i++){
			b[i].setBackground(Color.PINK);
		}
		for(int i=4;i<12;i++){
			b[i].setBackground(new Color(245,245,245));
		}
		for(int i=12;i<27;i++){
			b[i].setBackground(Color.WHITE);
		}
		b[15].setBackground(new Color(245,245,245));
		b[19].setBackground(new Color(245,245,245));
		b[23].setBackground(new Color(245,245,245));
		b[27].setBackground(new Color(135,206,235));
		add(jp1);
		add(jp2);
		add(jp3);
		
//安装文本框获取按钮字符监视器
		for(int i=11;i<24;i++)
			b[i].addActionListener(this);
		b[25].addActionListener(this);
		b[26].addActionListener(this);
		b[27].addActionListener(this);
		
//实现“MC、MR、MS、M+”功能
		b[0].setEnabled(false);
		b[1].setEnabled(false);
		b[0].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				b[0].setEnabled(false);
				b[1].setEnabled(false);
				m="";
			}
		});
		b[1].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				str1=m;
				tf.setText(str1);
			}
		});
		b[2].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				m=str1;
			}
		});
		b[3].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				b[0].setEnabled(true);
				b[1].setEnabled(true);
				double n;
				if(m=="")
					m="0";
				n=Double.valueOf(str1)+Double.valueOf(m);
				m=String.valueOf(n);
			}
		});
		
//实现“%”功能
		b[4].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				String[] c;
				double t=0;
				double last=0;
				double[] d = new double[100];
				if(str1.contains("+")){
					c=str1.split("[+]");
					for(int i=0;i<c.length;i++)
						d[i]=Double.valueOf(c[i]);
					for(int i=0;i<c.length-1;i++)
						last+=d[i]*d[c.length-1];
					last=last/100;
					for(int i=0;i<c.length-1;i++)
						t+=d[i];
					str1=String.valueOf(t);
					str1+="+"+last;
					tf.setText(str1);
				}
				else if(str1.contains("-")){
					c=str1.split("-");
					for(int i=0;i<c.length;i++)
						d[i]=Double.valueOf(c[i]);
					last=d[0]*d[c.length-1];
					for(int i=1;i<c.length-1;i++)
						last-=d[i]*d[c.length-1];
					last=last/100;
					t=d[0];
					for(int i=1;i<c.length-1;i++)
						t-=d[i];
					str1=String.valueOf(t);
					if(last>=0){
						str1+="-"+-last;
						tf.setText(str1);
					}
					else{
						
						str1+="+"+-last;
						tf.setText(str1);
					}
				}
				else if(str1.contains("×")){
					c=str1.split("×");
					for(int i=0;i<c.length;i++)
						d[i]=Double.valueOf(c[i]);
					last=d[c.length-1]/100;
					t=d[0];
					for(int i=1;i<c.length-1;i++)
						t*=d[i];
					str1=String.valueOf(t);
					str1+="×"+last;
					tf.setText(str1);
				}
				else if(str1.contains("÷")){
					c=str1.split("÷");
					for(int i=0;i<c.length;i++)
						d[i]=Double.valueOf(c[i]);
					last=d[c.length-1]/100;
					t=d[0];
					for(int i=1;i<c.length-1;i++)
						t/=d[i];
					str1=String.valueOf(t);
					str1+="÷"+last;
					tf.setText(str1);
				}
				else{
					str1="0";
					tf.setText(str1);
				}
			}
		});
		
//实现“CE”撤销功能
		b[5].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				String[] c;
				if(str1.contains("+")){
					c=str1.split("[+]");
					str1="";
					for(int i=0;i<c.length-1;i++){
						str1+=c[i]+"+";
					}
					tf.setText(str1);
				}
				else if(str1.contains("-")){
					c=str1.split("-");
					str1="";
					for(int i=0;i<c.length-1;i++){
						str1+=c[i]+"-";
					}
					tf.setText(str1);
				}
				else if(str1.contains("×")){
					c=str1.split("×");
					str1="";
					for(int i=0;i<c.length-1;i++){
						str1+=c[i]+"×";
					}
					tf.setText(str1);
				}
				else if(str1.contains("÷")){
					c=str1.split("÷");
					str1="";
					for(int i=0;i<c.length-1;i++){
						str1+=c[i]+"÷";
					}
					tf.setText(str1);
				}
	        
	       }
	    });
		
//实现“C”清空功能
		b[6].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				str1="0";
				tf.setText(str1);
				b[11].setEnabled(true);
				b[15].setEnabled(true);
				b[19].setEnabled(true);
				b[23].setEnabled(true);
	       }
	    });
		
//实现“backspace”退格功能
		b[7].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				if(str1.length()==0||"".equals(str1)){
	                tf.setText("0");
				}
				else{
					str1=str1.substring(0, str1.length()-1);
					tf.setText(str1);
					if("".equals(str1)){
						tf.setText("0");
					}
				}
				if(str1.indexOf("+")==-1&&str1.indexOf("-")==-1&&str1.indexOf("×")==-1&&str1.indexOf("÷")==-1){
					b[11].setEnabled(true);
					b[15].setEnabled(true);
					b[19].setEnabled(true);
					b[23].setEnabled(true);
				}
			}
		});
		
//实现“1/x”倒数功能
		b[8].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				if(str1.length()==0||Double.valueOf(str1)==0)
					tf.setText("除数不能为零");
				else{
					double d;
					d=Double.valueOf(str1);
					d=1/d;
					str1=String.valueOf(d);
					tf.setText(str1);
				}
			}
		});
		
//实现“x²”平方功能
		b[9].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				if(str1.length()==0)
					tf.setText("0");
				else{
					double d;
					d=Double.valueOf(str1);
					d=d*d;
					str1=String.valueOf(d);
					tf.setText(str1);
					str1="";
				}
			}
		});
		
//实现“sqrt”开根功能
		b[10].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				if(str1.length()==0)
					tf.setText("0");
				else if(Double.valueOf(str1)<0)
					tf.setText("无效输入");
				else{
					double d;
					d=Double.valueOf(str1);
					d=Math.sqrt(d);
					str1=String.valueOf(d);
					tf.setText(str1);
				}
			}
		});


//实现“+/-”符号转换功能
		b[24].addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				if(str1.length()==0)
					tf.setText("0");
				else{
					double d;
					d=Double.valueOf(str1);
					d=-d;
					str1=String.valueOf(d);
					tf.setText(str1);
				}
			}
		});
	}

		

/*
 * 
 * 
 *按钮的监视器方法,使文本框获取按钮字符
 * 
 */
	public void actionPerformed(ActionEvent e){
		String[] c;			  //用于分隔字符
		String str=e.getActionCommand();
		double d;
		double total=0;//d,total用于转化字符为double进行运
		if("0".equals(str1))
			str1="";
		str1+=str;
//解决运算符连续点击的问题
		if(str1.length()>=2){
			String s1=str1.substring(str1.length()-2,str1.length());
			if(str1.contains("÷÷")||str1.contains("××")||str1.contains("++")||str1.contains("--")){
				str1=str1.substring(0,str1.length()-1);
			}
		}
		//
		tf.setText(str1);
		
//限制同一次等式中只能存在一种运算符，需按“=”后才能继续进行其他运算
		if(str1.indexOf("+")!=-1||str1.indexOf("-")!=-1||str1.indexOf("×")!=-1||str1.indexOf("÷")!=-1){
			if(str1.contains("÷")){
				b[15].setEnabled(false);
				b[19].setEnabled(false);
				b[23].setEnabled(false);
			}
			if(str1.contains("×")){
				b[11].setEnabled(false);
				b[19].setEnabled(false);
				b[23].setEnabled(false);
			}
			if(str1.contains("-")){
				b[11].setEnabled(false);
				b[15].setEnabled(false);
				b[23].setEnabled(false);
			}
			if(str1.contains("+")){
				b[11].setEnabled(false);
				b[15].setEnabled(false);
				b[19].setEnabled(false);
			}
		}
		else{
			b[11].setEnabled(true);
			b[15].setEnabled(true);
			b[19].setEnabled(true);
			b[23].setEnabled(true);
		}
		
//“=”等号被触发时
		if(b[27].equals(e.getSource())){
			//实现“+”加法运算功能
			if(str1.contains("+")){
				String s=str1.substring(0,str1.length()-1);
				c=s.split("[+]");
				for(int i=0;i<=c.length-1;i++){
					d=Double.valueOf(c[i]);
					total+=d;
				}
				str1+=String.valueOf(total);
				tf.setText(str1);
			}
			//实现“-”减法运算功能
			else if(str1.contains("-")){
				String s=str1.substring(0,str1.length()-1);
				c=s.split("-");
				total=Double.valueOf(c[0]);
				for(int i=1;i<=c.length-1;i++){
					d=Double.valueOf(c[i]);
					total-=d;
				}
				str1+=String.valueOf(total);
				tf.setText(str1);
			}
			//实现“×”乘法运算功能
			else if(str1.contains("×")){
				String s=str1.substring(0,str1.length()-1);
				c=s.split("×");
				total=Double.valueOf(c[0]);
				for(int i=1;i<=c.length-1;i++){
					d=Double.valueOf(c[i]);
					total*=d;
				}
				str1+=String.valueOf(total);
				tf.setText(str1);
			}
			//实现“÷”除法运算功能
			else if(str1.contains("÷")){
				String s=str1.substring(0,str1.length()-1);
				c=s.split("÷");
				total=Double.valueOf(c[0]);
				for(int i=1;i<=c.length-1;i++){
					d=Double.valueOf(c[i]);
					total/=d;
				}
				if(String.valueOf(total)=="Infinity"){
					str1="除数不能为零";
					tf.setText(str1);
				}
				else{
					str1+=String.valueOf(total);
					tf.setText(str1);
				}
			}
			//解决没有按运算符直接按“=”问题
			else{
				if("=".equals(str1)){
					str1="0";
					tf.setText(str1);
					str1="";
				}
				if(str1!=""){
					c=str1.split("=");
					str1+=c[0];
					tf.setText(str1);
				}
			}
			//点击“=”后设置运算符可选
			b[11].setEnabled(true);
			b[15].setEnabled(true);
			b[19].setEnabled(true);
			b[23].setEnabled(true);
			c=str1.split("=");
			str1=c[c.length-1];  //运算成功后str1只保留计算结果
		}
		
		
//每次触发“.”小数点时只能输入一次
		if(b[26].equals(e.getSource())){
			if(str1.contains("+")){
				c=str1.split("[+]");
				if (c[0].indexOf(".") == c[0].lastIndexOf(".")) {
					if(".".equals(c[0])){
						c[0]="0.";
					}
				} 
				else {
					c[0]=c[0].substring(0,c[0].length()-1);
				}
				str1=c[0];
				
				for (int i = 1; i <c.length; i++) {
					if (c[i].indexOf(".") == c[i].lastIndexOf(".")) {
						if(".".equals(c[i])){
							c[i]="0.";
						}
					} 
					else {
						c[i]=c[i].substring(0,c[i].length()-1);
					}
					str1+="+"+c[i];			
				}
				tf.setText(str1);
			}
			else if(str1.contains("-")){
				c=str1.split("-");
				if (c[0].indexOf(".") == c[0].lastIndexOf(".")) {
					if(".".equals(c[0])){
						c[0]="0.";
					}
				} 
				else {
					c[0]=c[0].substring(0,c[0].length()-1);
				}
				str1=c[0];
				
				for (int i = 1; i <c.length; i++) {
					if (c[i].indexOf(".") == c[i].lastIndexOf(".")) {
						if(".".equals(c[i])){
							c[i]="0.";
						}
					} 
					else {
						c[i]=c[i].substring(0,c[i].length()-1);
					}
					str1+="-"+c[i];			
				}
				tf.setText(str1);
			}
			else if(str1.contains("×")){
				c=str1.split("×");
				if (c[0].indexOf(".") == c[0].lastIndexOf(".")) {
					if(".".equals(c[0])){
						c[0]="0.";
					}
				} 
				else {
					c[0]=c[0].substring(0,c[0].length()-1);
				}
				str1=c[0];
				
				for (int i = 1; i <c.length; i++) {
					if (c[i].indexOf(".") == c[i].lastIndexOf(".")) {
						if(".".equals(c[i])){
							c[i]="0.";
						}
					} 
					else {
						c[i]=c[i].substring(0,c[i].length()-1);
					}
					str1+="×"+c[i];			
				}
				tf.setText(str1);
			}
			else if(str1.contains("÷")){
				c=str1.split("÷");
				if (c[0].indexOf(".") == c[0].lastIndexOf(".")) {
					if(".".equals(c[0])){
						c[0]="0.";
					}
				} 
				else {
					c[0]=c[0].substring(0,c[0].length()-1);
				}
				str1=c[0];
				
				for (int i = 1; i <c.length; i++) {
					if (c[i].indexOf(".") == c[i].lastIndexOf(".")) {
						if(".".equals(c[i])){
							c[i]="0.";
						}
					} 
					else {
						c[i]=c[i].substring(0,c[i].length()-1);
					}
					str1+="÷"+c[i];			
				}
				tf.setText(str1);
			}
			else{
				for (int i = 0; i < str1.length(); i++) {
					if (str1.indexOf(".") == str1.lastIndexOf(".")) {
						if(".".equals(str1)){
							str1="0.";
							tf.setText(str1);
						}
					} 
					else {
						str1=str1.substring(0,str1.length()-1);
						tf.setText(str1);
					}
				}
			}
		}
	}
}




